"""内置高阶函数"""


class Enemy:
	def __init__(self, name, hp, atk, defense):
		self.name = name
		self.hp = hp
		self.atk = atk
		self.defense = defense

	def __str__(self):
		return f"{self.name}, {self.hp}, {self.atk}, {self.defense}"


list1 = [
	Enemy("张三", 86, 120, 58),
	Enemy("成昆", 0, 100, 5),
	Enemy("谢逊", 86, 130, 60),
	Enemy("灭霸", 0, 1390, 790)
]

# filter(函数, 可迭代对象)         根据条件筛选可迭代对象中的元素,返回新的可迭代对象
# 1. filter 过滤器, 与自己写的list_helper生成器功能一样能够做到
re = filter(lambda items: items.hp == 0, list1)
for item in re:
	print(item)

print("获取所有敌人的名字---------")
# 2. map(函数, 可迭代对象) 映射(通用的筛选方法)
# 使用可迭代对象中的每个元素调用函数, 将返回值作为新可迭代对象元素.返回值为新可迭代对象
for item in map(lambda so: so.name, list1):
	print(item)

print("排序-------------")
# 3. sorted(可迭代对象, key = 函数, reverse = bool 值True从高到低, false从低到高)  排序, 返回值为排序结果
so = sorted(list1, key=lambda sl: sl.atk, reverse=True)
for item in so:
	print(item)

# 4. max(可迭代对象, key = 函数) 根据函数获取可迭代对象的最大值
print("获取血量最大的敌人-------------")
print(max(list1, key=lambda so: so.hp))


# 5. min(可迭代对象, key = 函数) 根据函数获取可迭代对象的最小值, 只返回遇到的第一个0
print("获取血量最小的敌人-------------")
print(min(list1, key=lambda so: so.hp))